package com.example.aicoverage.service.impl;

import com.example.aicoverage.model.ChatRoom;
import com.example.aicoverage.service.ChatService;
import com.example.aicoverage.utils.AiManager;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

@Service
public class ChatServiceImpl implements ChatService {

    @Resource
    private AiManager aiManager;

    // 全局消息映射
    final Map<Long, List<ChatMessage>> globalMessagesMap = new HashMap<>();

    /**
     * 聊天
     *
     * @param roomId  聊天室 id
     * @param message 用户自己输入的消息
     * @return
     */
    @Override
    public String doChat(long roomId, String message) {
        // 系统预设
        final String systemPrompt = "你是一个精通古代文化的射覆游戏主持人，熟悉《燕云十六声》的射覆规则和《红楼梦》式诗词典故玩法。你的任务是引导玩家通过线索猜中谜底，同时保持游戏的趣味性和挑战性。\n" +
                "\n" +
                "核心规则：\n" +
                "\n" +
                "谜面生成：\n" +
                "当玩家说“开始”时，你需生成一个与古代相关的谜面，谜底限定为人物、物品、典故或自然现象（如“青钢-宝剑”“橙红-凌霄” ）。\n" +
                "谜面需引用古文/诗句中的字词（如“吾不如老圃”射“圃” ），或描述特征（如“伞型”射“香菇” 但不可直言谜底。\n" +
                "当游戏结束时，你必须在结束消息中包含【游戏已结束】"+
                "\n" +
                "反馈机制：\n" +
                "玩家猜测后，根据谜底特性给出三类反馈：\n" +
                "“相近”：类别/材质/功能接近（如猜“砚台”对谜底“墨锭” ）。\n" +
                "“相远”：完全无关（如猜“兵器”对谜底“茶盏”）。\n" +
                "“部分相关”：某特征吻合但其他不符（需说明具体关联，如“材质正确但功能不符”）。\n" +
                "特殊机制：\n" +
                "卦象提示：若玩家连续3次“相远”，可提供易经卦象辅助（如“见震卦，主东方木器” ）。\n" +
                "两覆一射：允许追加第二个限定字（如探春覆“人”+“窗”射“鸡” ）。\n" +
                "交互流程示例：\n" +
                "玩家：“开始”\n" +
                "你：“覆者曰：‘肃’（出自《诗经·肃肃鸨羽》）” \n" +
                "玩家：“弓箭”\n" +
                "你：“相远”\n" +
                "玩家：“鸿雁”\n" +
                "你：“相近（同属鸟类）”\n" +
                "玩家：“羽毛”\n" +
                "你：“射中！谜底为‘羽毛’。”" +
                "【游戏已结束】";
        // 1. 准备消息列表（关联历史上下文）
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(systemPrompt).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(message).build();

        List<ChatMessage> messages = new ArrayList<>();
        // 首次开始时，需要初始化消息列表，并且额外添加系统消息到记录中
        if (!message.equals("开始") && globalMessagesMap.isEmpty()) {
            throw new RuntimeException("请先开始游戏");
        }
        if (message.equals("开始") && !globalMessagesMap.containsKey(roomId)) {
            globalMessagesMap.put(roomId, messages);
            messages.add(systemMessage);
        } else {
            // 之后不用重复初始化，而是读取过去的消息列表
            messages = globalMessagesMap.get(roomId);
        }
        messages.add(userMessage);

        // 2. 调用 AI
        String answer = aiManager.doChat(messages);

        final ChatMessage assistantMessage = ChatMessage.builder().role(ChatMessageRole.ASSISTANT).content(answer).build();
        messages.add(assistantMessage);

        // 3. 返回消息
        if (answer.contains("【游戏已结束】")) {
            globalMessagesMap.remove(roomId);
        }
        return answer;
    }

    /**
     * 获取聊天室列表
     *
     * @return
     */
    @Override
    public List<ChatRoom> getChatRoomList() {
        List<ChatRoom> chatRoomList = new ArrayList<>();
        for (Map.Entry<Long, List<ChatMessage>> roomIdMessageListEntry : globalMessagesMap.entrySet()) {
            ChatRoom chatRoom = new ChatRoom();
            chatRoom.setRoomId(roomIdMessageListEntry.getKey());
            chatRoom.setChatMessageList(roomIdMessageListEntry.getValue());
            chatRoomList.add(chatRoom);
        }
        return chatRoomList;
    }
}
